package com.intelligence.tio.common;

import java.nio.ByteBuffer;
import org.tio.core.ChannelContext;
import org.tio.core.GroupContext;
import org.tio.core.exception.AioDecodeException;
import org.tio.core.intf.AioHandler;


/**
 * tio抽象处理器，用于指定Tio传输和接受数据加码和解码工作
 * @author 郭浩柱
 * 2017年5月17日
 */
public abstract class TioAbsAioHandler implements AioHandler<TioSessionContext, JsonPacket, Object>
{
	/**
	 * 编码：把业务消息包编码为可以发送的ByteBuffer
	 * 消息头：type + bodyLength
	 * 消息体：byte[]
	 */

	public ByteBuffer encode(JsonPacket packet, GroupContext<TioSessionContext, JsonPacket, Object> groupContext, ChannelContext<TioSessionContext, JsonPacket, Object> channelContext)
	{
		//获取JSON对象 消息体内容字节数组
		byte[] body = packet.getBody();
		int bodyLen = 0;
		if (body != null)
		{
			bodyLen = body.length;
		}
		//实例化一个字符缓存对象，
		ByteBuffer buffer = ByteBuffer.allocate(bodyLen);
		//将发送内容放入字节缓存对象里面
		buffer.put(body);
		return buffer;
	}

	/**
	 * 解码：把接收到的ByteBuffer，解码成消息对象
	 */

	public JsonPacket decode(ByteBuffer buffer, ChannelContext<TioSessionContext, JsonPacket, Object> channelContext) throws AioDecodeException
	{
		//获取可读数据内容长度
		int readableLength = buffer.limit() - buffer.position();
		JsonPacket imPacket = new JsonPacket();
		//实例化数组并将缓存数据读写进入数组，然后将二进制数组给消息对象
		byte[] dst = new byte[readableLength];
		buffer.get(dst);
		imPacket.setBody(dst);
		
		return imPacket;
	}
}
